


//
//  SQLiteManager.swift
//  创建数据库
//
//  Created by YYY on 2017/11/20.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//
//INSERT OR REPLACE INTO status(statusID, userID, Text) VALUES(2000, 1010, "happy");

import Foundation
import FMDB

/*
 什么数据适合做缓存：
 1:实时敏感度不高。
 2:更新频率低。
 3:有查询需求的。
 */
//最大的数据库缓存周期
private let maxDBCacheTime: TimeInterval = -60 //-5 * 24 * 60 * 60
//数据库是保存在沙盒的一个文件，需要先创建和打开数据库
//FMDB的内部队列是串行队列，同步执行。可以保证同一时间，只有一个任务操作数据库，从而保证数据库的读写安全。
//只有在创建表的时候，使用执行多条语句，可以创建多个表
//增删改查，不使用执行多条语句

class SQLiteManager
{
    //队列
    let queue: FMDatabaseQueue
    
    //创建单例
    static let shared = SQLiteManager()
    
    private init()
    {
        let dbName = "status.db"
        var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        path = (path as NSString).appendingPathComponent(dbName)
        print("数据库路径：\(path)")
        //创建数据库队列
        queue = FMDatabaseQueue(path: path)
        
        //创建表
        createTable()
        
        //注册通知，监听应用程序进入后台，清除数据缓存
        NotificationCenter.default.addObserver(self, selector: #selector(clearCache), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
    }
    
    //注销通知
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    //SQLite数据库不断增加数据，数据库文件的大小，不断增加。
    //如果删除了数据，数据库的大小不会变小。
    @objc private func clearCache()
    {
        print("清除数据缓存 \(Date.dateConvertToString(interval: maxDBCacheTime))")
        //日期字符串
        let dateString = Date.dateConvertToString(interval: maxDBCacheTime)
        let sql = "DELETE FROM weibo WHERE createTime < ?;"
        queue.inDatabase { (db) in
            if db.executeUpdate(sql, withArgumentsIn: [dateString]) == true
            {
                print("删除了\(db.changes)条记录")
            }
        }
        
    }
}

//创建表
private extension SQLiteManager
{
    //创建表
    func createTable()
    {
        guard let path = Bundle.main.path(forResource: "sina.sql", ofType: nil),
            let sql = try? String(contentsOfFile: path) else
        {
            return
        }
        
        //执行SQL语句
        //只有在创建表的时候，使用执行多条语句，可以创建多个表
        //增删改查，不使用执行多条语句
        queue.inDatabase { (db) in
            if db.executeStatements(sql) == true
            {
                print("创表成功")
            }
            else
            {
                print("创表失败")
            }
        }
    }
}

//插入表
extension SQLiteManager
{
    func updateTable(userId: String, array: [[String: Any]])
    {
        let sql = "INSERT OR REPLACE INTO weibo(statusId, userId, status) VALUES(?, ?, ?);"
        queue.inTransaction { (db, roolback) in
            for dict in array
            {
                guard let statusId = dict["idstr"],
                    let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) else
                {
                    continue
                }
                if db.executeUpdate(sql, withArgumentsIn: [statusId, userId, jsonData]) == false
                {
                    //需要回滚
                    roolback.pointee = true
                    break
                }
                else
                {
                    print("更新成功")
                }
            }
        }
    }
}

//查询表
extension SQLiteManager
{
    //查询全部 SELECT * FROM weibo;
    func queryTable(sql: String) -> [[String: Any]]
    {
        var result = [[String: Any]]()
        queue.inDatabase { (db) in
            //结果集
            guard let resultSet = db.executeQuery(sql, withArgumentsIn: []) else
            {
                return
            }
            while resultSet.next()
            {
                let columnCount = resultSet.columnCount
                for i in 0..<columnCount
                {
                    //列名
                    guard let name = resultSet.columnName(for: i),
                          let value = resultSet.object(forColumnIndex: i) else
                    {
                        continue
                    }
     
                    result.append([name: value])
                }
            }
        }
        return result
    }
}

extension SQLiteManager
{
    func deleteTable()
    {
        let sql = "DELETE FROM weibo"
        
    }
}
extension SQLiteManager
{
    /// 加载微博数据
    ///
    /// - Parameters:
    ///   - userID: 登录用户的ID
    ///   - since_id: 返回比since_id大的数据
    ///   - max_id: 返回比max_id小的数据
    /// - Returns: 返回字典数组
    func loadStatus(userId: String, since_id: Int64 = 0, max_id: Int64 = 0) -> [[String: Any]]
    {
        var sql = "SELECT statusId, userId, status FROM weibo \n"
        sql += "WHERE userId = \(userId) \n"
        if since_id > 0
        {
            sql += "AND statusId > \(since_id) \n"
        }
        else if max_id > 0
        {
            sql += "AND statusId < \(max_id) \n"
        }
        sql += "ORDER BY statusId DESC LIMIT 20"
 
        //查询
        let array = queryTable(sql: sql)
        
        var result = [[String: Any]]()
        for dict in array
        {
            //反序列化数据库保存的json数据
            guard let data = dict["status"] as? Data,
                  let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else
            {
                continue
            }
            result.append(json ?? [:])
        }
        return result
    }
}
